let say=(num=8)=>{
  return "你好"
}
// ts的类型
// 1。boolean 布尔    let 变量名:类型=值;
let kk=true; //默认ts 去自己推断类型
let flag:boolean=false; //创建变量直接赋值
let dirFlag:boolean; //先创建变量在赋值
// dirFlag=99;//报错 类型错误
dirFlag=true;//必须赋值成布尔值
//2. string 字符串
let myname:string="王德发"
myname="字符串"
//3.number 类型
let count:number=99;
count=100;
//4。null  空类型
let x:null=null;

// 5.undefined 未定义 为赋值
let z; //类型为any 不是undefined
let y:undefined=undefined

// ------------------------------------------------------
// 6. any 任意类型 可以赋值任意类型
let homestr;//any类型 任意类型
homestr="99"
homestr=true;
let cate:any="99"
cate=100;
//7.数组
// 第一种写法
let arr:number[]=[1,2,3,12.8]//数字类型的数组
// 第二种写法 (数组泛型)
let list:Array<number>=[5,6,7,8];
// 字符串类型的数组
let person:string[]=["是","sdf","sd撒旦法"];
// 字符串和数字类型的数组
let cars:Array<string|number>=["q8","特斯拉",88,100]
let mylist:(number|string|boolean)[]=["你好",99,true];
//存放任意类型的数组
let myarr=[]; //any类型的数组
let myCounts:any[]=["sdf",null,undefined,88,true,{name:1,age:2}]

// 8.元组类型允许表示一个已知元素数量和类型的数组，
// 各元素的类型不必相同。 比如，你可以定义一对值分别为 string 和 number 类型的元组。
let klist:[string,boolean,number]=["你好",true,88]
let myboss:[Array<number>,string,object,Array<string|number>,any];
myboss=[[1,2,3],"sdf",{name:1},[1,"sdf"],33]

// 9.void 空类型  没有任何值  常用于标注函数没有返回值
function run():void{
     var x=1;
}
// 函数的返回值类型 返回字符串
function getParams():string{
  return "你好"
}
// 函数的返回值是对象
function getList():object{
  var x=1;
  console.log(x)
  return {
    name:1,
    age:2
  }
}
// 10.object 类型 对象类型
let obj:object={
  name:1,
  age:2,
  say:function(){}
}
let arrK:Array<object>=[{name:1,age:2},{name:3,age:4}]

// 11.enum 类型是对 JavaScript 标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字
enum Color {
  Red, //0
  Blue, //1
  Green //2
}
console.log(Color.Blue) //1
enum ColorList{
  Red=3,
  Blue, 
  Green
}
console.log(ColorList.Blue)//4
//12,联合类型  在泛型中<string|number> 或(string|number)
let arrH:Array<number|string>=["收到",88]
function sayHello(a:number=99,b:(boolean|string),){
    console.log(a)
    console.log(b)
}
sayHello(166,true)
function kkSay(a:any){
}
// 13. 类型断言
  // 通过类型断言这种方式可以告诉编译器，“相信我，我知道自己在干什么”。
  //  类型断言好比其它语言里的类型转换，但是不进行特殊的数据检查和解构。 
  //  它没有运行时的影响，只是在编译阶段起作用。 TypeScript 会假设你，程序员，已经进行了必须的检查。
    let kstr="今天是个好日子"
    let str;
    str=kstr
    console.log(str.substr(4))
// x初始为number类型
// 类型断言
//   <string>x 类型推断第一种写法
//   (x as string) 类型推断的第二种写法
function krun(x,y){
  if((<string>x).length){
    console.log(888)
  }
}
console.log(krun(8848,99))
let kkgg="sdfhkasdhfkasdh";
console.log((kkgg as string).substr(4))

// 14.类推推断
let kss; //没有值 为any类型
let ssr="sdf";//有值 推断为值的类型

// 类型断言
let sname:string|number;

(sname as string).length;
(<string>sname).length
 
function genLen(inp:number|string):number{
  let str=inp as string; //先类型断言成字符串
  if(str.length){
    return str.length
  }else{
    // let num=inp as number //赋值并类型断言
    let num=<number>inp //赋值并类型断言
    return num
  }
}

